import axios from "axios";

//引入进度条
import nProgress from "nprogress";
import "nprogress/nprogress.css";

//创建一个实例,并传入配置对象
//针对不同环境,配置不同的基础路径.可以通过环境变量的形式
// console.log(process.env,'当前环境变量信息');//可以获取当前环境变量信息

const request = axios.create({
    //这里基础路径可以根据环境变量来获取当前配置路径
    baseURL:process.env.VUE_APP_MOCKAPI ,
    timeout:10000,
})

//给实例配置拦截器
//请求拦截器
request.interceptors.request.use(
    (config)=>{
        nProgress.start()
        //这里的config是axios的请求对象
        // console.log(config,'con');
        //拦截其中逻辑完成后要将congif配置对象返回出去，否则请求无法继续进行
        return config;
    },
    //请求拦截其中
    //进入处理失败的回调函数有两种方法：1.请求拦截器可以设置多个，当上一次失败的就会进入当此的失败函数  2.给拦截器传入额外的参数，主动进入
    (err)=>{
        nProgress.done()
        //如果拦截器错误的请求下,我们要返回一个失败的promise实例
      //为什么要返回失败的promise实例????? 因为拦截器最终的返回结果是通过then方式返回的,then或catch只有再返回失败的promise实例的时候,then或catch才是失败状态,axios才能之后我们失败了
        return Promise.reject(err)
    }
)

//配置响应拦截器
request.interceptors.response.use(
    (response)=>{
        nProgress.done()
            //response是请求回来axios组装的数据,其中data属性是服务端响应的数据
        // console.log(response,'res');
        //我们一定要在响应拦截器中返回一个数据,否则axios方法无法得到数据
        //当请求成功时获取数据判断
        if(response.data.code === 200){
            return response.data.data;
        }else{
            return Promise.reject({ message: response.data.message })
        }
    },
    (err)=>{
        nProgress.done()
        //当响应失败,则处理失败情况,要返回一个失败的priomise实例
        return Promise.reject(err)
    }
)


export default request;         